var makeSound = function (animal) {
    if (animal instanceof Duck) {
        console.log('嘎嘎嘎');
    } else if (animal instanceof Chicken) {
        console.log('咯咯咯');
    }
};

var Duck = function () {};
var Chicken = function () {};

makeSound(new Duck());    // 嘎嘎嘎
makeSound(new Chicken()); // 咯咯咯

/**
 * 修改代码总是危险的，修改的地方越多，程序出错的可能性就越大。
 * 多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来，也就是将“不变的事物”与“可能改变的事物”分离开来。
 */

// 首先我们把不变的部分隔离开来，那就是所有的动物都会发出叫声。
var makeSound = function (animal) {
    animal.sound();
};

// 把可变的部分各自封装起来。
// 多态性实际上指的是对象的多态性。
var Duck = function () {};

Duck.prototype.sound = function () {
    console.log('嘎嘎嘎');
};

var Chicken = function () {};

Chicken.prototype.sound = function () {
    console.log('咯咯咯');
};

makeSound(new Duck());    // 嘎嘎嘎
makeSound(new Chicken()); // 咯咯咯

// 如果增加一只狗，这时只要简单地追加一些代码就可以了，而不用改动以前的 makeSound 函数
var Dog = function () {};

Dog.prototype.sound = function () {
    console.log('汪汪汪');
};
makeSound(new Dog());  // 汪汪汪